#include <iostream>
#include <thread> //c++
#include <unistd.h>

using namespace std;

void threadrun(int num)
{
    while (num)
    {
        cout << "I am new thread,num: " << num-- << endl;
        sleep(1);
    }
}

int main()
{
    thread t1(threadrun, 10);
    while (true)
    {
        cout << "I am main thread"<< endl;
        sleep(1);
    }

    t1.join();
    return 0;
}

// #include <iostream>
// #include <pthread.h> //原生线程库
// #include <unistd.h>
// #include <cstdio>
// #include <vector>
// #include <string>
// #include <cstdlib>

// using namespace std;
// class Task
// {
// public:
//     Task(int x, int y) : _x(x), _y(y)
//     {
//     }
//     int Excute()
//     {
//         return _x + _y;
//     }
//     ~Task()
//     {
//     }

// private:
//     int _x;
//     int _y;
// };

// class ThreadData
// {
// public:
//     ThreadData(int x, int y, const string &threadname) : _t(x, y), _threadname(threadname)
//     {
//     }
//     string threadname()
//     {
//         return _threadname;
//     }
//     int run()
//     {
//         return _t.Excute();
//     }
//     ~ThreadData()
//     {
//     }

// private:
//     string _threadname;
//     Task _t;
// };
// class Result
// {
// public:
//     Result()
//     {
//     }
//     void SetResult(int result, string threadname)
//     {
//         _result = result;
//         _threadname = threadname;
//     }
//     void Print()
//     {
//         cout<<_threadname<<": "<<_result<<endl;
//     }
//     ~Result()
//     {
//     }

// private:
//     int _result;
//     string _threadname;
// };
// void *handlerTask(void *args)
// {
//     ThreadData *td = static_cast<ThreadData *>(args);
//     Result *res = new Result();

//     string name = td->threadname();

//     int num = td->run();
//     res->SetResult(num, name);

//     cout << name << "run num:" << num << endl;
//     delete td;

//     sleep(2);
//     return res;
//     // const char* threadname = static_cast<char *>(args);
//     // while (true)
//     // {
//     //     sleep(1);
//     //     cout << "I am " << threadname << endl;
//     // }
//     // delete []threadname;
// }

// const int threadnum = 5;
// // 多线程的创建
// int main()
// {
//     vector<pthread_t> threads;
//     for (int i = 0; i < threadnum; i++)
//     {
//         char threadname[64];
//         // char *threadname = new char[64];
//         snprintf(threadname, 64, "Thread-%d", i + 1);
//         ThreadData *td = new ThreadData(10, 20, threadname);

//         pthread_t tid;
//         pthread_create(&tid, nullptr, handlerTask, td);
//         threads.push_back(tid);
//     }

//     vector<Result*> result_set;
//     void *ret=nullptr;
//     for (auto &tid : threads)
//     {
//         pthread_join(tid, nullptr);
//         result_set.push_back((Result*)ret);
//     }

//     for(auto& res:result_set)
//     {
//         res->Print();
//     }
// }

// // string ToHex(pthread_t tid)
// // {
// //     char id[64];
// //     snprintf(id,sizeof(id),"0x%lx",tid);
// //     return id;
// // }

// // int g_val=100;

// // void *threadrun(void *arg)
// // {
// //     int cnt = 5;
// //     while (cnt)
// //     {
// //         cout << "新线程正在运行：" << cnt << "pid:" << getpid() << endl;
// //         sleep(1);
// //         cout<<"g_val: "<<g_val++<<"&g_val"<<&g_val<<endl;
// //         cnt--;
// //     }
// //     return (void*)1223;
// // }
// // int main()
// // {
// //     // int pthread_create(pthread_t * thread, const pthread_attr_t *attr,
// //     // void *(*start_routine)(void *), void *arg);\

// //     //1.id
// //     pthread_t tid;
// //     pthread_create(&tid, nullptr, threadrun, nullptr);

// //     cout<<"g_val: "<<g_val++<<"&g_val"<<&g_val<<endl;
// //     void *ret=nullptr;

// //     int n=pthread_join(tid,&ret);

// //     // cout<<"主线程退出,n= "<<n<<"return:"<<(long long)ret<<endl;

// //     // int cnt = 10;
// //     // while (cnt)
// //     // {
// //     //     cout << "主线程正在运行：" << cnt << "pid:" << getpid()<<" tid: "<<ToHex(tid)<<endl;
// //     //     sleep(1);
// //     //     cnt--;
// //     // }
// //     return 0;
// // }